﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace _42_Kicks
{

    /* Classe Sprite étendue aux Sprites animés, donc on peut avoir des animations,
       on utilisera cette classe pour les personnages  */
    public class AniSprite
    {
        public Vector2 position;
        public Rectangle source;
        public Texture2D texture;
        TimeSpan temps;



        public AniSprite(Vector2 position, Rectangle source)
        {
            this.position = position;
            this.source = source;
        }

        public AniSprite(float posx, float posy, int x, int y, int width, int height)
        {
            position = new Vector2(posx, posy);
            source = new Rectangle(x, y, width, height);
        }

        public AniSprite(Texture2D texture)
        {
            this.texture = texture;
        }
        public virtual void LoadContent(ContentManager content, string assetName)
        {
            texture = content.Load<Texture2D>(assetName);

        }
        public virtual void Update(Vector2 translation)
        {
            position += translation;

        }


        //Cette methode  fonctionne  pour une spritesheet sur plusieurs lignes

        public virtual void DefileSprite(int minimum, int maximum, int coory, int milliseconds, int nsx, GameTime gameTime)
        {
            /*minimum est la coordonnée min sur le spritesheet, maximum la coordonnée max sur le spritesheet, coory est la coordonnée en Y sur la spritesheet
            milliseconds est l'écart de temps suivant lequel on change d'images pour notre sprite,
            nsx est la nouvelle largeur du rectangle qu'on dessine
            gameTime osef de ce que c'est faut le mettre sinon ça marche pas */

            source.Width = nsx; //on redéfinit la largeur de notre rectangle,
            //car sur la spritesheet toutes les animations ne sont pas forcément espacées pareil
            source.Y = coory;
            if (source.X < minimum)
            { source.X = minimum; }
            if (source.X > maximum)
            { source.X = minimum; }


            if (gameTime.TotalGameTime.Subtract(temps).Milliseconds >= milliseconds)
            {
                if (source.X < minimum)
                { source.X = minimum; }
                if (source.X > maximum)
                { source.X = minimum; }
                source.X = (source.X > (maximum - nsx) ? (minimum) : source.X + (nsx + 1));
                temps = gameTime.TotalGameTime;

            }
        }

        public virtual void DefileSpriteGauche(int minimum, int maximum, int coory, int milliseconds, int nsx, GameTime gameTime)
        {
            /*minimum est la coordonnée min sur le spritesheet, maximum la coordonnée max sur le spritesheet, coory est la coordonnée en Y sur la spritesheet
            milliseconds est l'écart de temps suivant lequel on change d'images pour notre sprite,
            nsx est la nouvelle largeur du rectangle qu'on dessine
            gameTime osef de ce que c'est faut le mettre sinon ça marche pas */

            source.Width = nsx; //on redéfinit la largeur de notre rectangle,
            //car sur la spritesheet toutes les animations ne sont pas forcément espacées pareil
            source.Y = coory;
            if (source.X < minimum)
            { source.X = maximum; }
            if (source.X > maximum)
            { source.X = maximum; }


            if (gameTime.TotalGameTime.Subtract(temps).Milliseconds >= milliseconds)
            {
                if (source.X < minimum)
                { source.X = maximum; }
                if (source.X > maximum)
                { source.X = maximum; }
                source.X = (source.X < (minimum - nsx) ? (maximum) : source.X - (nsx + 1));
                temps = gameTime.TotalGameTime;

            }
        }


        public virtual void Gravitédemerde(float altitude, float altisol)
        {

            if (altitude < altisol)
                position.Y += 8;

        }




        public virtual void Draw(SpriteBatch spriteBatch, Color colour)
        {
            spriteBatch.Draw(texture, position, source, colour);


        }

    }
}

